package main

import (
	"context"
	"fmt"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/tools/clientcmd"
)

/*
  @Author : lanyulei
  @Desc :
*/

func main() {
	// 加载配置文件，生成 config 对象
	config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err.Error())
	}

	// 实例化 DynamicClient
	dynamicClient, err := dynamic.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	// 设置要请求的 GVR
	gvr := schema.GroupVersionResource{
		Group:    "",
		Version:  "v1",
		Resource: "pods",
	}

	// 发送请求，并得到返回结果
	unStructData, err := dynamicClient.Resource(gvr).Namespace("default").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}

	// 使用反射将 unStructData 的数据转成对应的结构体类型，例如这是是转成 v1.PodList 类型
	podList := &corev1.PodList{} // 自定义的资源类型需要自己实现客户端代码，参考k8s_customize_controller/pkg目录
	err = runtime.DefaultUnstructuredConverter.FromUnstructured(
		unStructData.UnstructuredContent(),
		podList,
	)
	if err != nil {
		panic(err.Error())
	}

	// 输出 Pods 资源信息
	for _, item := range podList.Items {
		fmt.Printf("namespace: %v, name: %v\n", item.Namespace, item.Name)
	}
}
